﻿/*! @file
********************************************************************************
<PRE>
文 件 名    : PlugInFactory.cs
说    明    : 插件工厂类
作    者    : 汪泽然
--------------------------------------------------------------------------------
备    注    : 
--------------------------------------------------------------------------------
修改记录: 
 * 日   期      版  本       修改人      修改内容 
 * 2009-7-11    0.5.0       汪泽然       实现对插件的检测功能，修复了无配置信息的空指针异常
</PRE>
********************************************************************************
* 版权所有(c) 2008 ~ 2009, 汪泽然, 保留所有权利
*******************************************************************************/
using System;
using System.Text;
using System.Configuration;
using System.Collections.Generic;
using System.Collections.Specialized;
using Wangzeran.Transform.Core.ITransform;
using Wangzeran.Transform.Core.TransformException;
using Wangzeran.Transform.Core.Support;

namespace Wangzeran.Transform.Core.PlugIn
{
    /// <summary>
    /// 插件工厂类
    /// </summary>
    /// <remarks>
    /// 从配置文件中获取插件信息
    /// </remarks>
    public abstract class PlugInFactory
    {
    	/// <summary>
    	/// 根节点
    	/// </summary>
    	private const string RootNode = "Transform";
    	
    	/// <summary>
    	/// 插件集合节点
    	/// </summary>
    	private const string PlugInsNode = "PlugIns";
    	
        /// <summary>
        /// 插件集合
        /// </summary>
        private static IDictionary<String, BaseTransformFactory> registerPlugIns = null;

        /// <summary>
        /// 获取所有注册成功插件
        /// </summary>
        public static IDictionary<String, BaseTransformFactory> RegisterPlugIns
        {
            get
            {
                if (registerPlugIns == null)
                {
                    // 初始化插件
                    GetPlugIns();
                }
                return registerPlugIns;
            }
        }

        /// <summary>
        /// 初始化所有插件
        /// </summary>
        /// <remarks>
        /// 从配置文件中读取插件信息
        /// </remarks>
        private static void GetPlugIns()
        {
            try
            {
                registerPlugIns = 
                    (Dictionary<string, BaseTransformFactory>)
                    ConfigurationManager.GetSection(RootNode + "/" + PlugInsNode);

                if (registerPlugIns == null)
                {
                    registerPlugIns = new Dictionary<string, BaseTransformFactory>();
                }
            }
            catch (InvalidPlugInException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {
                throw new InvalidPlugInException(ex.Message);
            }
        }

    }
}
